package db.entity;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Iterator;

import db.BaseDAO;
import db.Transaction;
import db.TransformInterface;

import model.Node;

/**
 * 
 * Description: 对资源数据进行处理的DAO。
 * 
 * @since  2009/3/3
 * @author ashen
 * 
 */
public class NodeDAO extends BaseDAO implements TransformInterface<Node>{
	
	private String type;
	
	public NodeDAO(String type){
		setTableName("mapscheme.node");
		this.type=type;
	}
	
	public NodeDAO(){
		setTableName("mapscheme.node");
	}
	
	/**
	 * the method save of class NodeDAO
	 * 
	 * 该方法将参数资源对象存储到数据库
	 * 
	 * @param node 需要保存的Node对象
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 操作成功与否
	 */
	public boolean save(Node node){
		Transaction transaction=new Transaction();
		save(object2HashMap(node),transaction);
		return transaction.commit();
	}
	
	/**
	 * the method update of class NodeDAO 
	 * 
	 * 该方法将参数资源对象更新到数据库
	 * 
	 * @param node 需要更新的Node对象
	 * @param id 需要更新的Node对象id值
	 * @param transaction 数据库操作类Transaction的对象
	 */
	public void update(Node node,Integer id,Transaction transaction){
		update(object2HashMap(node),"ID",id,transaction);
	}
	
	/**
	 * the method delete of class NodeDAO
	 * 
	 * 该方法删除指定ID的资源
	 * 
	 * @param id 需要删除的资源的ID
	 * @return 返回操作成功与否
	 */
	public boolean delete(int id){
		return delete("id",id);
	}

	/**
	 * the method findAll of class NodeDAO
	 * 
	 * 该方法返回所有资源
	 * 
	 * @param transaction 数据库操作类Transaction的对象
	 * @return ArrayList<Node>类型，返回数据中所有资源
	 */
	public ArrayList<Node> findAll(Transaction transaction){
		return list2ObjectList(super.findAllBase(transaction));
	}
	
	/**
	 * the method findById of class NodeDAO
	 * 
	 * 该方法通过指定资源ID查找资源
	 * 
	 * @param id 资源ID
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 查询到的资源
	 */
	public Node findById(int id,Transaction transaction){	        		 	        
        return hashMap2Object(findByPK("id",id,transaction));
	}
	
	/**
	 * the method findByName of class NodeDAO
	 * 
	 * 该方法通过指定景点名称查找景点
	 * 
	 * @param name 资源名称
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 查询到的资源
	 */
	public Node findByName(String name,Transaction transaction){	        		 	        
        return hashMap2Object(findByPK("name",getFormatString(name),transaction));
	}
	
	/**
	 * the method findByUserId of class NodeDAO
	 * 
	 * 该方法通过指定资源创建者的ID查找资源
	 * 
	 * @param ownerId 资源创建者的ID
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 查询到的资源列表
	 */
	public ArrayList<Node> findByOwnerId(int ownerId,Transaction transaction){	        		 	        
        return list2ObjectList(findByProperty("ownerId", ownerId,transaction));
	}
	
	/**
	 * the method findByKeyword of class NodeDAO
	 * 
	 * 该方法通过指定资源关键字查找资源
	 * 
	 * @param name 资源名称
	 * @param description 资源描述
	 * @param type 资源类型
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 查询到的资源列表
	 */
	public ArrayList<Node> findByKeyword(String name,String description,String type,Transaction transaction){	        		
		return list2ObjectList(findLikeKeyword("name", name, "description", description,type,transaction));
	}
	
	/**
	 * the method findBySight of class NodeDAO
	 * 
	 * 该方法找到id为参数值的所有下级景点，并返回
	 * 
	 * @param type 资源的type
	 * @param transaction 数据库操作类Transaction的对象
	 * @return 资源记录集
	 */
	public ArrayList<Node> findByType(String type,Transaction transaction){        		
		return list2ObjectList(findByProperty("type","'"+type+"'",transaction));
	}
	
	
	/**
	 * the method list2ObjectList of class NodeDAO
	 * 
	 * 该方法将存有资源信息的HashMap对象数组转换为Node对象数组
	 * 
	 * @param hashMapList HashMap对象数组
	 * @return Node对象数组
	 */
	public ArrayList<Node> list2ObjectList(ArrayList<HashMap> hashMapList){
		Node tempPoint=null;
		ArrayList<Node> resultList=new ArrayList<Node>();
		if(hashMapList.isEmpty())
			return resultList;
		for(Iterator i=hashMapList.iterator();i.hasNext();){
			tempPoint=hashMap2Object((HashMap)i.next());
			if(tempPoint!=null)
				resultList.add(tempPoint);
		}
		return resultList;
	}
	
	/**
	 * the method hashtable2Point of class NodeDAO
	 * 
	 * 该方法将HashMap类型的对象转换为Node的对象，并返回Node的对象.
	 * 
	 * @param hashMap 存储了一个景点信息的HashMap类型的对象
	 * @return Node的对象.
	 */
	public Node hashMap2Object(HashMap hashMap){
		if(hashMap==null)
			return null;
		Node node=new Node();
		node.setId((Integer)hashMap.get("ID"));
		node.setName((String)hashMap.get("NAME"));			
		node.setOwnerId((Integer)hashMap.get("OWNERID"));
		node.setDescription((String)hashMap.get("DESCRIPTION"));
		node.setCreateDate((Date)hashMap.get("CREATEDATE"));
		return node;
	}
	
	/**
	 * the method object2HashMap of class NodeDAO
	 * 
	 * 该方法将参数Node对象转换为存储参数Node对象信息的HashMap对象，并返回
	 * 
	 * @param node 资源Node对象
	 * @return 存储参数资源Node对象信息的HashMap对象
	 */
	public HashMap object2HashMap(Node node){
		HashMap hashMap=new HashMap();
		hashMap.put("ID", "default");
		hashMap.put("NAME", getFormatString(node.getName()));
		hashMap.put("TYPE", getFormatString(type));
		hashMap.put("OWNERID", node.getOwnerId());
		hashMap.put("DESCRIPTION", getFormatString(node.getDescription()));
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
	    String dateString = formatter.format(node.getCreateDate());
		hashMap.put("CREATEDATE", getFormatString(dateString));
		return hashMap;
	}

}